package com.tunan.common;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;

import com.tunan.system.dic.service.IBscDicCodeService;
import com.tunan.system.persistence.model.BscDicCodeItem;
import com.tunan.utils.StringUtils;

public class ConvertDict{
	private Logger logger = Logger.getLogger(ConvertDict.class);
	
	private IBscDicCodeService bscDicCodeService;
	
	/**值类型<itemCode,itemName>*/
	private Map<String,String> itemMap;
	
	public ConvertDict(IBscDicCodeService bscDicCodeService) {
		this.bscDicCodeService = bscDicCodeService;
	}

	public void setItemMap(Map<String, String> itemMap) {
		this.itemMap = itemMap;
	}
	

	public void setBscDicCodeService(IBscDicCodeService bscDicCodeService) {
		this.bscDicCodeService = bscDicCodeService;
	}


	//**************************************************************************
	/**
	 * TODO 转换数据字典成Map集合 <br><pre>
	 * 根据不周的参数类型去匹配方法,转换参数
	 * 编写者：yangjian@toonan.com
	 * 创建时间：2016年4月11日 下午4:10:41 </pre>
	 * @param 参数类型 参数名 说明
	 * @return Map<String,String> 说明
	 * @throws 异常类型 说明
	 */
	//**************************************************************************
	private Map<String,String> getDictItemMap(Map<String,String> typeMap){
		List<BscDicCodeItem> itemslist=null;
		Map<String,String> dictMap=null;
		//根据不同的方法查询,返回数据字典数组
		if(itemMap!=null&&itemMap.isEmpty()){
			dictMap=itemMap;
		}else if(typeMap!=null&&!typeMap.isEmpty()){
			Collection<String> typeCodeList=typeMap.values();
			if(!typeCodeList.isEmpty()){
				int size = typeCodeList.size();  
				String[] typeCodes=typeCodeList.toArray(new String[size]);
				itemslist =bscDicCodeService.findExportItems(typeCodes);
				
				dictMap=new HashMap<String, String>();
				for (BscDicCodeItem bscDicCodeItem : itemslist) {
					dictMap.put(bscDicCodeItem.getTypeCode()+":"+bscDicCodeItem.getItemCode(), bscDicCodeItem.getItemName());
				}
			}
		}else{
			logger.error("请传正确的参数进行键值对转换!");
		}
		return dictMap;
	}
	
	
	//**************************************************************************
	/**
	 * TODO 返回下拉框Map集合 <br><pre>
	 * 编写者：yangjian@toonan.com
	 * 创建时间：2016年4月12日 下午4:08:34 </pre>
	 * @param 参数类型 参数名 说明
	 * @return Map<String,String> 说明
	 * @throws 异常类型 说明
	 */
	//**************************************************************************
	public Map<String,String> getConvertItemMap(List<String> typeCodeList){
		List<BscDicCodeItem> itemslist=null;
		Map<String,String> dictMap=null;
		//根据不同的方法查询,返回数据字典数组
		if(!typeCodeList.isEmpty()){
			int size = typeCodeList.size();  
			String[] typeCodes=typeCodeList.toArray(new String[size]);
			itemslist =bscDicCodeService.findExportItems(typeCodes);
			
			dictMap=new HashMap<String, String>();
			for (BscDicCodeItem bscDicCodeItem : itemslist) {
				dictMap.put(bscDicCodeItem.getItemCode(), bscDicCodeItem.getItemName());
			}
		}else{
			logger.error("请传正确的参数进行键值对转换!");
		}
		return dictMap;
	}
	
	//**************************************************************************
	/**
	 * TODO 返回原对象数据字典转换过后的数据 <br><pre>
	 * 单条记录转换返回 <br>
	 * 编写者：yangjian@toonan.com
	 * 创建时间：2016年4月11日 下午4:28:34 </pre>
	 * @param 参数类型 参数名 说明
	 * @return T 泛型对象类,keys [字段属性名称,数据字典类型编码]
	 * @throws Exception 
	 * @throws 异常类型 说明
	 */
	//**************************************************************************
	public <T> T getConvertItem(T t,Map<String,String> keys){	
		try {
			if(t!=null){//判断对象是否为空
				Map<String,String> dictMap=getDictItemMap(keys);
				if(dictMap!=null&&!dictMap.isEmpty()){//判断字典值和字段类型Map集合不为空
					for (Map.Entry<String, String> m : keys.entrySet()) {
						String keyValue=(String) PropertyUtils.getProperty(t,m.getKey());//获取需要转换字段的值
						if(StringUtils.isNotBlank(m.getValue())){//判断typeCode是否为空
							String dictName=dictMap.get(m.getValue()+":"+keyValue);
							if(StringUtils.isBlank(dictName)){
								dictName=keyValue;
							}
							PropertyUtils.setProperty(t,m.getKey(),dictName);
						}else{//如果typeCode为空时,则为常量设置属性值
							PropertyUtils.setProperty(t,m.getKey(),dictMap.get(keyValue));
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage(), e);
//			throw new Exception("数据字典键值对转换错误!");
		}
		return t;
	}
	
	//**************************************************************************
	/**
	 * TODO 返回原对象数据字典转换过后的数据 <br><pre>
	 * 多条记录转换返回 <br>
	 * 编写者：yangjian@toonan.com
	 * 创建时间：2016年4月11日 下午4:28:34 </pre>
	 * @param 参数类型 参数名 说明
	 * @return T 泛型对象类,keys [字段属性名称,数据字典类型编码]
	 * @throws Exception 
	 * @throws 异常类型 说明
	 */
	//**************************************************************************
	public <T> List<T> getConvertItems(List<T> tList,Map<String,String> keys){
		try {
			if(!tList.isEmpty()){
				Map<String,String> dictMap=getDictItemMap(keys);
				if(dictMap!=null&&!dictMap.isEmpty()){//判断字典值和字段类型Map集合不为空
					for (T t : tList) {
						for (Map.Entry<String, String> m : keys.entrySet()) {
							String keyValue=(String) PropertyUtils.getProperty(t,m.getKey());//获取需要转换字段的值
							if(StringUtils.isNotBlank(m.getValue())){//判断typeCode是否为空
								String dictName=dictMap.get(m.getValue()+":"+keyValue);
								if(StringUtils.isBlank(dictName)){
									dictName=keyValue;
								}
								PropertyUtils.setProperty(t,m.getKey(),dictName);
							}else{//如果typeCode为空时,则为常量设置属性值
								PropertyUtils.setProperty(t,m.getKey(),dictMap.get(keyValue));
							}
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage(), e);
//				throw new Exception("数据字典键值对转换错误!");
		}
		return tList;
	}
}
